package com.zenithmind.document.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.document.pojo.domain.Document;
import com.zenithmind.document.pojo.dto.DocumentCreateDTO;
import com.zenithmind.document.pojo.dto.DocumentUpdateDTO;
import com.zenithmind.document.pojo.dto.DocumentUploadDTO;
import com.zenithmind.document.pojo.query.DocumentQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentDetailVO;
import com.zenithmind.document.pojo.vo.DocumentStatisticsVO;
import com.zenithmind.document.pojo.vo.DocumentVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 文档服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface DocumentService extends IService<Document> {

    /**
     * 上传文档
     * 
     * @param uploadDTO 上传信息
     * @return 文档信息
     */
    DocumentVO uploadDocument(DocumentUploadDTO uploadDTO);

    /**
     * 创建文档
     * 
     * @param createDTO 创建信息
     * @return 文档信息
     */
    DocumentVO createDocument(DocumentCreateDTO createDTO);

    /**
     * 更新文档
     * 
     * @param id 文档ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateDocument(String id, DocumentUpdateDTO updateDTO);

    /**
     * 删除文档
     * 
     * @param id 文档ID
     * @return 是否成功
     */
    Boolean deleteDocument(String id);

    /**
     * 批量删除文档
     * 
     * @param ids 文档ID列表
     * @return 是否成功
     */
    Boolean batchDeleteDocuments(List<String> ids);

    /**
     * 恢复文档
     * 
     * @param id 文档ID
     * @return 是否成功
     */
    Boolean restoreDocument(String id);

    /**
     * 分页查询文档
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<DocumentVO> getDocumentPage(DocumentQueryDTO queryDTO);

    /**
     * 获取文档详情
     * 
     * @param id 文档ID
     * @param userId 用户ID
     * @return 文档详情
     */
    DocumentDetailVO getDocumentDetail(String id, String userId);

    /**
     * 搜索文档
     * 
     * @param keyword 关键词
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> searchDocuments(String keyword, String userId, Integer limit);

    /**
     * 全文搜索文档
     * 
     * @param searchText 搜索文本
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> fullTextSearchDocuments(String searchText, String userId, Integer limit);

    /**
     * 获取用户文档
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getUserDocuments(String userId, Integer limit);

    /**
     * 获取分类文档
     * 
     * @param categoryId 分类ID
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getCategoryDocuments(String categoryId, String userId, Integer limit);

    /**
     * 获取热门文档
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getHotDocuments(String userId, Integer limit);

    /**
     * 获取最新文档
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getLatestDocuments(String userId, Integer limit);

    /**
     * 获取推荐文档
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getRecommendedDocuments(String userId, Integer limit);

    /**
     * 获取相关文档
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getRelatedDocuments(String documentId, String userId, Integer limit);

    /**
     * 获取收藏文档
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getFavoriteDocuments(String userId, Integer limit);

    /**
     * 获取最近访问文档
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<DocumentVO> getRecentDocuments(String userId, Integer limit);

    /**
     * 下载文档
     * 
     * @param id 文档ID
     * @param userId 用户ID
     * @return 文件流
     */
    byte[] downloadDocument(String id, String userId);

    /**
     * 预览文档
     * 
     * @param id 文档ID
     * @param userId 用户ID
     * @return 预览URL
     */
    String previewDocument(String id, String userId);

    /**
     * 转换文档格式
     * 
     * @param id 文档ID
     * @param targetFormat 目标格式
     * @param userId 用户ID
     * @return 转换后的文档ID
     */
    String convertDocument(String id, String targetFormat, String userId);

    /**
     * 提取文档内容
     * 
     * @param id 文档ID
     * @return 文档内容
     */
    String extractDocumentContent(String id);

    /**
     * 生成文档摘要
     * 
     * @param id 文档ID
     * @return 文档摘要
     */
    String generateDocumentSummary(String id);

    /**
     * 检查文档权限
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param permission 权限类型
     * @return 是否有权限
     */
    Boolean checkDocumentPermission(String documentId, String userId, String permission);

    /**
     * 收藏文档
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean favoriteDocument(String documentId, String userId);

    /**
     * 取消收藏文档
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unfavoriteDocument(String documentId, String userId);

    /**
     * 复制文档
     * 
     * @param sourceDocumentId 源文档ID
     * @param newName 新文档名称
     * @param userId 用户ID
     * @return 新文档信息
     */
    DocumentVO copyDocument(String sourceDocumentId, String newName, String userId);

    /**
     * 移动文档
     * 
     * @param documentIds 文档ID列表
     * @param categoryId 目标分类ID
     * @return 是否成功
     */
    Boolean moveDocuments(List<String> documentIds, String categoryId);

    /**
     * 获取文档版本列表
     * 
     * @param documentId 文档ID
     * @return 版本列表
     */
    List<DocumentVO> getDocumentVersions(String documentId);

    /**
     * 创建文档版本
     * 
     * @param documentId 文档ID
     * @param description 版本描述
     * @param userId 用户ID
     * @return 版本ID
     */
    String createDocumentVersion(String documentId, String description, String userId);

    /**
     * 恢复文档版本
     * 
     * @param documentId 文档ID
     * @param versionId 版本ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean restoreDocumentVersion(String documentId, String versionId, String userId);

    /**
     * 获取文档统计信息
     * 
     * @param documentId 文档ID
     * @return 统计信息
     */
    DocumentStatisticsVO getDocumentStatistics(String documentId);

    /**
     * 记录文档访问
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param accessType 访问类型
     * @return 是否成功
     */
    Boolean recordDocumentAccess(String documentId, String userId, String accessType);

    /**
     * 清理过期文档
     * 
     * @return 清理数量
     */
    Integer cleanupExpiredDocuments();

    /**
     * 获取文档存储统计
     * 
     * @param userId 用户ID
     * @return 存储统计
     */
    DocumentStatisticsVO getDocumentStorageStatistics(String userId);
}
